/*
 * utils.h
 *
 *  Created on: 2016年8月27日
 *      Author: LongShu
 */

#ifndef UTILS_H_
#define UTILS_H_

//标准库
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <ctype.h> //ctype.h是C标准函数库中的头文件，定义了一批C语言字符分类函数

//工具
#include "memory.h"
#include "stringUtils.h"

#define PI 3.14159265358979323846

/*
 * pi/4=1 - 1/3 + 1/5 - 1/7 + …
 */
double getPI() {
	double pi = 0.0, i = 1.0, j = 1.0;
	for (; i < 100000; i += 2, j = -j)
		pi += 1 / (i * j);
	pi = pi * 4;
	printf("pi=%1.20lf\n", pi);
	return pi;
}

//刷新控制台输出
//	setvbuf(stdout, NULL, _IONBF, 0);
//	setvbuf(stderr, NULL, _IONBF, 0);
/**
 * 刷新控制台
 */
#define flush() {fflush(stdout); fflush(stderr);}

/*
 * 不换行打印输出
 */
#define print(FORMAT,...) { printf(#FORMAT,##__VA_ARGS__); flush() }

/*
 * 换行打印输出
 */
#define println(FORMAT,...) { printf(#FORMAT"\n",##__VA_ARGS__); flush() }

#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define MIN(x, y) (((x) < (y)) ? (x) : (y))

/*
 * 显示数组内容
 */
#define printArray(array,size){\
	for(int i=0;i<size;i++){\
		println([%-d\t%-d,i,array[i]);\
	}\
	println();\
}

#define connChar(x,y) x##y
//#define toChar(x) #@x
#define toString(value) #value

/*
 * 求数字长度,不能是数组的指针
 */
#define sizeofArray(data) (sizeof(data)/sizeof(data[0]))

/*
 * 交换,任何类型
 */
#define SWAP(x,y,TYPE){\
	TYPE temp = (x);\
	(x) = (y);\
	(y) = temp;\
}

/*
 * 排序(冒泡)
 */
#define SORT(arr, size,TYPE) {\
	int flag;\
	for (int i = 1; i < size; ++i) {\
		flag = 0;\
		for (int j = 0; j < size - 1; ++j) {\
			if (arr[j] > arr[j + 1]) {\
				flag = 1;\
				SWAP(arr[j], arr[j + 1], TYPE);\
			}\
		}\
		if (flag == 0) break;\
	}\
}

/*
 * 逆转
 */
#define REVERSE(arr,size,TYPE){\
	int j = (size) - 1;\
	for (int i = 0; i < (size) / 2; i++){\
		SWAP(arr[i], arr[j], TYPE);\
	}\
}

/*
 * 产生随机数种子
 */
void SRANDOM() {
	//用时间做种，每次产生随机数不一样
	srand((unsigned) time(NULL));
}

/*
 * 产生随机数 [a,b]
 */
int RANDOM(int a, int b) {
	return (rand() % (b - a + 1)) + a;
}

/*
 * 判断是否是闰年
 * 年份是整百数时，必须是400的倍数才是闰年；不是400的倍数的年份，即使是4的倍数也不是闰年
 */
int leapYear(int year) {
	if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
		return 1;
	else
		return 0;
}

// 递归计算阶乘
long factorial_recursion(int n) {
	if (n <= 0) {
		return 1;
	} else {
		return n * factorial_recursion(n - 1);
	}
}

// 迭代计算阶乘
long factorial_iteration(int n) {
	long result = 1;
	while (n > 1) {
		result *= n;
		n--;
	}
	return result;
}

#endif /* UTILS_H_ */
